﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//1.类模板；
//template<class NameType, class AgeType>
//4.类模板可以有默认类型；
template<class NameType, class AgeType = int>
class PersonClass
{
public:
	PersonClass(NameType name, AgeType age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}

	void showPerson()
	{
		cout << "4.姓名： " << this->m_Name << " ,年龄： " << this->m_Age << endl;
	}

	NameType m_Name;
	AgeType m_Age;
};
//2.指定传入类型；
void doWorkTemplate(PersonClass<string, int>& p)
{
	p.showPerson();
}
//3.参数模板化；
template<class T1, class T2>
void doWorkTemplateParam(PersonClass<T1, T2>& p)
{
	//6.查看参数类型；
	cout << typeid(T1).name() << endl;//class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
	cout << typeid(T2).name() << endl;//int
	p.showPerson();
}
//5.整体模板化；
template<class T>
void doWorkTemplateWhole(T& p)
{
	cout << typeid(T).name() << endl;//class PersonClass<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>
	p.showPerson();
}

void testClassTemplateParam()
{
	PersonClass<string, int>p("MT", 10);
	doWorkTemplate(p);//4.姓名： MT ,年龄： 10

	PersonClass<string, int>pc("毛妹", 18);
	doWorkTemplateParam(pc);//4.姓名： 毛妹 ,年龄： 18

	PersonClass<string, int>ph("全通", 18);
	doWorkTemplateWhole(ph);//4.姓名： 全通 ,年龄： 18
}

//main302：类模板做函数的参数
int main302()
{
	testClassTemplateParam();

	system("pause");
	return EXIT_SUCCESS;
}